#,> convert run.sh to run.md : ``` sed  's/#,//g;s/#`/`/g;s/echo \\#/#/g;s/echo //g' run.sh > run.sh.generated_doc.md ```
# linux_kernel_analyze



##  ref
#,> [使用Docker构建Linux Kernel的运行及调试环境](https://s3.shizhz.me/s3e1)

echo \## 1. 宿主机环境：ubuntu 18.04.1 LTS - kernel 4.15.0-29-generic
#```bash
uname -a
#Linux zz 4.15.0-29-generic #31-Ubuntu SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

cat /etc/issue
#Ubuntu 18.04.1 LTS \n \l
#```


echo \## 2. 下载本仓库
echo - 假若已经下载过源码，则不再下载
#```bash
gitRepoConfigF=/pubx/linux_kernel_analyze/.git/config
test -f $gitRepoConfigF || \
(cd /pubx/ && \
git clone git@gitcode.net:pubx/analyze_code/linux_kernel_analyze.git)

test -f $gitRepoConfigF && \
(cd /pubx/linux_kernel_analyze/ && git pull)
#```

echo \## 3. 构建docker镜像 ：编译kernel环境: debian:10.8-slim
#```bash
cd /pubx/linux_kernel_analyze/docker/ && \
#,#docker: 如果存在该镜像，则不用再构建
(sudo docker images linux-builder || sudo docker build -t linux-builder .) && \
(sudo docker stop  linux-builder || sudo docker rm linux-builder)
#```


echo \## 4.A 下载linux kernel源码
#```bash
#,#:cd /pubx/linux_kernel_analyze/

# md5sum linux-5.12.14.tar.xz > linux-5.12.14.tar.xz.md5sum.txt
#,#:md5sum --check linux-5.12.14.tar.xz.md5sum.txt || \
#,#如果不存在内核源码包，则下载
#,#:(wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.12.14.tar.xz)

#,#:test -d linux-5.12.14 || \
#,#如果不存在解压目录，则解压
#,#:tar -xJf linux-5.12.14.tar.xz


#```


echo \## 4.B 下载linux kernel源码, 使用https://gitee.com/mirrors/Linux.git 的标签 v5.12-rc8, 并伪装为 linux-5.12.14
#```bash
cd /pubx/linux_kernel_analyze/

test -f linux-5.12.14/.git/config || \
git clone https://gitee.com/mirrors/Linux.git && \
cd Linux && git checkout v5.12-rc8 && cd -  && \
#v5.12-rc8 和 5.12.14 应该是比较接近的, 因此 估计可以直接用 5.12.14的menuconfig结果obj/linux/.config
mv Linux  linux-5.12.14 && \
#/pubx/linux_kernel_analyze/linux-5.12.14/.git/config

#```

echo \## 5. linux内核 menuconfig
#```bash
cd /pubx/linux_kernel_analyze/ && mkdir -p ./obj/linux && \
echo "已经做过kernel menuconfig，故而 省略: sudo docker run   --name linux-builder-menuconfig -v /pubx/linux_kernel_analyze/:/workspace linux-builder bash /workspace/docker/menuconfig.sh " 
#```

echo \## 6. 构建linux内核
#```bash
cd /pubx/linux_kernel_analyze/ && mkdir -p ./obj/linux && \
echo "已经做过kernel menuconfig，故而 省略: sudo docker run   --name linux-builder-menuconfig -v /pubx/linux_kernel_analyze/:/workspace linux-builder bash /workspace/docker/menuconfig.sh " && \
sudo docker run   --name linux-builder --rm -v /pubx/linux_kernel_analyze/:/workspace linux-builder bash build-kernel.sh
#,# v5.12-rc8  复用 5.12.14 的 menuconfig结果obj/linux/.config ，在构建内核时 会问 DMA...Y/n? 选Y即可
#,# 若手工运行 命令改为 sudo docker run -it ... bash
ls -lh obj/linux/arch/x86/boot/bzImage 
#,#-rw-r--r-- 1 root root 8.7M  6月  6 23:01 obj/linux/arch/x86/boot/bzImage
#```

echo **busybox用作为initramfs**

echo \## 7. 下载Busybox源码: 
#```bash
cd /pubx/linux_kernel_analyze/
# md5sum busybox-1.33.1.tar.bz2 > busybox-1.33.1.tar.bz2.md5sum.txt
md5sum --check busybox-1.33.1.tar.bz2.md5sum.txt || \
#,#如果不存在Busybox源码包，则下载
(wget https://busybox.net/downloads/busybox-1.33.1.tar.bz2)

test -d busybox-1.33.1 || \
#,#如果不存在解压目录，则解压
tar -xjf busybox-1.33.1.tar.bz2

#```

echo \## 8. Busybox menuconfig
echo \> Busybox menuconfig:  Settings ---\> 勾选 Build static binary \(no shared libs\) 
#```bash
cd /pubx/linux_kernel_analyze/ && mkdir -p ./obj/busybox && \
echo "已经做过 busybox menuconfig，故而 省略: sudo docker run   --name busybox-builder-menuconfig -v /pubx/linux_kernel_analyze/:/workspace linux-builder bash /workspace/docker/busybox-menuconfig.sh " 

#```


echo \## 9. 构建busybox
#```bash
cd /pubx/linux_kernel_analyze/ && mkdir -p ./obj/busybox && \
sudo docker run   --name linux-builder --rm -v /pubx/linux_kernel_analyze/:/workspace linux-builder bash /workspace/docker/build-busybox.sh
#,# 若手工运行 命令改为 sudo docker run -it ... bash
ls -lh ./obj/busybox/busybox
#,#-rwxr-xr-x 1 root root 2.6M Jun  6 16:00 obj/busybox/busybox


./obj/busybox/busybox ls
#,# ... ...

#```

echo \## 10. 创建 initramfs
#```bash

sudo docker run   --name linux-builder --rm -v /pubx/linux_kernel_analyze/:/workspace linux-builder bash /workspace/docker/initramfs.sh
#,# 若手工运行 命令改为 sudo docker run -it ... bash
ls -lh ./obj/initramfs-busybox.cpio.gz

#```

echo \## 11. 运行 kernel
#```bash

sudo docker run -it  --name linux-builder --rm -v /pubx/linux_kernel_analyze/:/workspace linux-builder bash /workspace/docker/start-kernel.sh
#,#次是需要 -it 以交互
#```



echo \## 12. 真机运行 kernel（带monitor，并dump-guest-memory）
#```bash

#,#monitor方式本地运行:
#,#qemu-system-x86_64 -kernel  obj/linux/arch/x86/boot/bzImage -initrd obj/initramfs-busybox.cpio.gz  -append "console=ttyS0" -monitor stdio
#,#(qemu) dump-guest-memory  ./mem_raw


#```
